<?php
require_once('includes/connexion_bdd.php');
require_once('includes/fonctions_donnees.php');

class utilisateur{


	protected $id;
	protected $nom;
	protected $prenom;
	protected $email;
	protected $dateNaissance;
	protected $sexe;
	protected $nomUsager;
	protected $mdp;
	protected $niveau;
	protected $valide;
	protected $valid;
	protected $erreurs;

	//Constructeur
	public function __construct(){
		$num_args = func_num_args();

		switch($num_args){
			case 0 :
				$bool =true;
				break;
			case 2 :
				$bool = $this->setNomUsager(func_get_arg(0),false);
				$bool &= $this->setMdp(func_get_arg(1),func_get_arg(1));
				break;
			case 8 :
				$bool = $this->setNom(func_get_arg(0));
				$bool &=$this->setPrenom(func_get_arg(1));
				$bool &=$this->setEmail(func_get_arg(2));
				$bool &=$this->setDateNaissance(func_get_arg(3));
				$bool &=$this->setSexe(func_get_arg(4));
				$bool &=$this->setNomUsager(func_get_arg(5),true);
				$bool &=$this->setMdp(func_get_arg(6),func_get_arg(7));
				break;
			default :
				$bool = false;
			break;
		}
		$this->valid = $bool ;
		$this->niveau = 0;

	}
	//////////////////////
	//Getters et setters//
	//////////////////////

	public function getId(){
		return $this->id;
	}

	public function getNom(){
		return affichage($this->nom);
	}

	public function setNom($nom){
		if(empty($nom)){
			$this->erreurs.="Le nom est obligatoire <br />";
			return 0;

		}
		else if(strlen($nom)<2){
			$this->erreurs.="Le nom doit contenir minimum 2 caract&egrave;res <br />";
			return 0;
		}
		else if(!preg_match('#^[a-zA-Z- ]+$#', $nom)){
			$this->erreurs.="Le nom doit contenir uniquement des lettres espaces et tirets <br />";
			return 0;
		}
		else {
			$this->nom = clean_data($nom);
			return 1;
		}
	}

	public function getPrenom(){
		return affichage($this->prenom);
	}

	public function setPrenom($prenom){
		if(empty($prenom)){

			$this->erreurs.="Le prenom est obligatoire <br />";
			return 0;
		}
		else if(strlen($prenom)<2){
			$this->erreurs.="Le pr&eacute;nom doit contenir minimum 2 caract&egrave;res <br />";
			return 0;
		}
		else if(!preg_match('#^[a-zA-Z- ]+$#', $prenom)){
			$this->erreurs.="Le prenom doit contenir uniquement des lettres espaces et tirets <br />";
			return 0;
		}
		else{
			$this->prenom = clean_data($prenom);
			return 1;
		}
	}


	public function getEmail(){
		return affichage($this->email);
	}

	public function setEmail($email){
		if(!empty($email)&&preg_match('#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#is', $email)){
			$this->email=clean_data($email);
			return 1;
		}
		else{
			$this->erreurs.="Le format de votre email est erron&eacute;.<br />";

			return 0;
		}
	}

	public function getDateNaissance(){
		$array= explode('-', $this->dateNaissance);
		if (count($array)==3) {
			$string = $array[2].'/'.$array[1].'/'.$array[0];
		}else{
			$string = count($this->dateNaissance);
		}
		return affichage($string);
	}

	public function setDateNaissance($annee){
		if(!empty($annee)&& estDate($annee)){
			$array = estDate($annee);
			$this->dateNaissance = $array[2].'-'.$array[1].'-'.$array[0];
			return 1;
		}
		else {
			$this->erreurs.="Votre date de naissance est erron&eacute;e.<br />";
			return 0;
		}
	}

	public function getSexe(){
		return affichage($this->sexe);
	}

	public function setSexe($sexe){

		if($sexe=="f" || $sexe=="h"){

			$this->sexe=clean_data($sexe);

			return 1;
		}
		else{
			$this->erreurs.="Votre sexe est erron&eacute; <br />";
			return 0;
		}
	}

	public function getNomUsager(){
		return affichage($this->nomUsager);
	}

	public function setNomUsager($pseudo,$inscription ){
		if(empty($pseudo)){
			$this->erreurs.="Le Nom d'Usager est obligatoire <br />";
			return 0;
		}
		else if(!($this->verifDoublon($pseudo)) && $inscription){
			$this->erreurs.="Ce nom d'usager est d&eacute;j&agrave; utilis&eacute; <br />";
			return 0;

		}
		else if(!preg_match('#^[a-zA-Z0-9]+$#', $pseudo)){
			$this->erreurs.="Le nom d'utilisateur doit contenir uniquement des lettres, espaces et tirets.<br />";
			return 0;
		}
		else{
			$this->nomUsager = clean_data($pseudo);
			return 1;
		}
	}

	public function getMdp(){
		return $this->mdp;
	}

	public function setMdp($pass,$verif_pass){
		if(empty($pass)){
			$this->erreurs.="Le mot de passe est obligatoire.<br />";
			return 0;
		}
		else if($pass!=$verif_pass){
			$this->erreurs.="Les deux mots de passe sont diff&eacute;rents.<br/>";
			return 0;
		}
		else{
			$this->mdp = md5($pass);
			return 1;
		}
	}

	public function getNiveau(){
		return $this->niveau;
	}
	public function getValide(){
		return affichage($this->valide);
	}
	public function isValid(){
		return $this->valid;
	}

	public function getErreurs(){
		return $this->erreurs;
	}


	public function modifClient($nom,$prenom,$email,$dateNaissance,$sexe,$ancien_mdp,$mdp,$verif_mdp){
		$bool =true;
		$this->erreurs="";
		if($this->nom!=clean_data($nom))
		$bool &= $this->setNom($nom);
		if($this->prenom!=clean_data($prenom))
		$bool &= $this->setPrenom($prenom);
		if($this->email!=clean_data($email))
		$bool &= $this->setEmail($email);
		if(estDate($dateNaissance) && $this->dateNaissance!=$dateNaissance)
		$bool &= $this->setDateNaissance($dateNaissance);
		if($this->sexe!=clean_data($sexe))
		$bool &= $this->setSexe($sexe);
		if($this->mdp==md5($ancien_mdp)){
			if(!empty($mdp)){
				$bool &= $this->setMdp($mdp, $verif_mdp);
			}
		}
		else{
			$this->erreurs .='Vous devez renseigner votre mot de passe pour une modification';
			$bool &= false;
		}
			

		$this->valid=$bool;

	}

	/////////////////////////////
	//Fonctions d'acces � la BD//
	/////////////////////////////

	//renvoie true si le pseudo est dispo
	public static function verifDoublon($pseudo){
		$ret = false;
		try {
			$bdd = Connect();

			$req = $bdd->prepare('SELECT id FROM client WHERE nomUsager=?');
			$req->execute(array($pseudo));

			if (!$req->fetch()){
				$ret = true;
			}
			$req->closeCursor();
		}
		catch(Exception $e){
			die('Erreur : '.$e->getMessage());
		}
		return $ret;

	}

	public function ajoutBD() {

		try {
			$bdd = Connect();

			$req = $bdd->prepare('INSERT INTO client(nom, prenom, email, dateNaissance, sexe, nomUsager, mdp)
									VALUES(:nom, :prenom, :email, :dateNaissance, :sexe, :nomUsager, :mdp)');
			$req->execute(array(
							'nom' => $this->nom,
							'prenom' => $this->prenom,
							'email' => $this->email,
							'dateNaissance' => $this->dateNaissance,
							'sexe' => $this->sexe,
							'nomUsager' => $this->nomUsager,
							'mdp' => $this->mdp
			));

			$this->id = $bdd->lastInsertId();
		}
		catch(Exception $e){
			die('Erreur : '.$e->getMessage());
		}
	}

	public function modifBD() {

		try {
			$bdd = Connect();

			$req = $bdd->prepare('UPDATE client SET nom = :nom,
													prenom = :prenom,
													email = :email,
													dateNaissance = :dateNaissance,
													sexe = :sexe, 
													nomUsager = :nomUsager, 
													mdp = :mdp
												WHERE id=:id');
			$req->execute(array(
								'nom' => $this->nom,
								'prenom' => $this->prenom,
								'email' => $this->email,
								'dateNaissance' => $this->dateNaissance,
								'sexe' => $this->sexe,
								'nomUsager' => $this->nomUsager,
								'mdp' => $this->mdp,
								'id' => $this->id								
			));
		}
		catch(Exception $e){
			die('Erreur : '.$e->getMessage());
		}
	}

	//recupertion des infos client dans la BD a partir du pseudo et mdp
	//renvoie false si le client n existe pas ou si il y en a plusieurs
	public static function getClientById($idC) {
		$ret=null;

		try {
			$bdd = Connect();

			$req = $bdd->prepare('SELECT * FROM client WHERE id=?');
			$req->execute(array($idC));

			// 			remplir les attributs du client recupere si il existe
			$ret= $req->fetch();

			$req->closeCursor();
		}
		catch(Exception $e){
			die('Erreur : '.$e->getMessage());
		}
		return $ret;
	}
	//recupertion des infos client dans la BD a partir du pseudo et mdp
	//renvoie false si le client n existe pas ou si il y en a plusieurs
	public function recupClientBD() {
		$ret=false;

		try {
			$bdd = Connect();

			$req = $bdd->prepare('SELECT * FROM client WHERE nomUsager=:nomUsager AND mdp=:mdp');
			$req->execute(array('nomUsager' => $this->nomUsager,
								'mdp' =>$this->mdp	));

			// 			remplir les attributs du client recupere si il existe
			if ($donnees = $req->fetch()) {
				$this->nom = $donnees['nom'];
				$this->prenom = $donnees['prenom'];
				$this->email = $donnees['email'];
				$this->dateNaissance = $donnees['dateNaissance'];
				$this->sexe = $donnees['sexe'];
				$this->id = $donnees['id'];
				$this->niveau = $donnees['niveau'];
				$this->valide = $donnees['valide'];



				$ret=true;
			}

			// 			s'il y a plus d'une entree ds la table ayant le meme nomUsager
			if ($donnees = $req->fetch()){
				$ret=false;
			}

			// 			fermer les r�sultats de recherche
			$req->closeCursor();
		}
		catch(Exception $e){
			die('Erreur : '.$e->getMessage());
		}
		return $ret;
	}

	public static function getAllClients($v) {

		try {
			$bdd = Connect();


			$req = $bdd->prepare('SELECT 	id, nom, prenom,sexe,
										DATE_FORMAT(dateInscription, \'%d/%m/%Y\') AS dateInscription,
										niveau
									FROM  client m 
									WHERE valide=:valide
									ORDER BY niveau DESC, dateInscription DESC
								');
			$req->execute(array('valide' => $v));

			return $req;
		}
		catch(Exception $e){
			die('Erreur : '.$e->getMessage());
		}
	}


	public static function supprBD($idC) {

		try {
			$bdd = Connect();

			// 			$req = $bdd->prepare('DELETE 	FROM	client
			// 										WHERE 	id=?');

			$req = $bdd->prepare('UPDATE client SET valide=0
												WHERE id=?');
			$req->execute(array($idC));

		}
		catch(Exception $e){
			die('Erreur : '.$e->getMessage());
		}
	}
	public static function activer($idC) {

		try {
			$bdd = Connect();

			$req = $bdd->prepare('UPDATE client SET valide=1
													WHERE id=?');
			$req->execute(array($idC));

		}
		catch(Exception $e){
			die('Erreur : '.$e->getMessage());
		}
	}
	public static function passerAdmin($idC) {

		try {
			$bdd = Connect();

			$req = $bdd->prepare('UPDATE client SET niveau=1
													WHERE id=?');
			$req->execute(array($idC));

		}
		catch(Exception $e){
			die('Erreur : '.$e->getMessage());
		}
	}

	public static function passerClient($idC) {

		try {
			$bdd = Connect();

			$req = $bdd->prepare('UPDATE client SET niveau=0
														WHERE id=?');
			$req->execute(array($idC));

		}
		catch(Exception $e){
			die('Erreur : '.$e->getMessage());
		}
	}

	// 	retourne un tableau contenant les resultats de recherche pour modele,taille
	public static function autocompletion($debut) {
		$suggestions = null;
		try {
			$bdd = Connect();

			$reqN = $bdd->prepare('SELECT DISTINCT nom
											FROM client
											WHERE nom LIKE :debut
											LIMIT 10
															');

			$reqN->execute(array('debut' => $debut.'%'));
			$suggestions['nom'] = $reqN;

			$reqP = $bdd->prepare('SELECT DISTINCT prenom
											FROM client
											WHERE prenom LIKE :debut
											LIMIT 10
															');

			$reqP->execute(array('debut' => $debut.'%'));
			$suggestions['prenom'] = $reqP;
				
			$reqE = $bdd->prepare('SELECT DISTINCT email
											FROM client
											WHERE email LIKE :debut
											LIMIT 10
															');

			$reqE->execute(array('debut' => $debut.'%'));
			$suggestions['email'] = $reqE;
				
			$reqPR = $bdd->prepare('SELECT DISTINCT prenom as prenomRes
											FROM reservation
											WHERE prenom LIKE :debut
											LIMIT 10
															');

			$reqPR->execute(array('debut' => $debut.'%'));
			$suggestions['prenomRes'] = $reqPR;

		}
		catch(Exception $e){
			die('Erreur : '.$e->getMessage());
		}
		return $suggestions;
	}


	public static function recherche($mot) {
		$resultats=null;
		try {
			$bdd = Connect();
			
			foreach (array(true,false) as $v) {
			$req = $bdd->prepare('SELECT 	id, nom, prenom,sexe,
											DATE_FORMAT(dateInscription, \'%d/%m/%Y\') AS dateInscription,
											niveau
											FROM  client m 
											WHERE valide=:valide
											AND (id LIKE :debut
												OR nom LIKE :debut
												OR prenom LIKE :debut
												OR sexe LIKE :debut
												OR email LIKE :debut)
											ORDER BY niveau DESC, dateInscription DESC
											LIMIT 10
								');

				$req->execute(array('debut' => '%'.$mot. '%',
									'valide' => $v));
				$resultats[$v] = $req;
			}
		}
		catch(Exception $e){
			die('Erreur : '.$e->getMessage());
		}
		return $resultats;
	}
}

?>